/*
 *  Copyright 2013 Utkin Dmitry
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */


#include <QDebug>
#include <QThread>
#include <protoqtrpc/DoneClosureRunner.h>
#include <protoqtrpc/RpcController.h>
#include "TestServiceImpl.h"

namespace protoqtrpc
{
namespace test
{

class DelayedResponse: public QThread
{
public:
    DelayedResponse(google::protobuf::RpcController* controller,
                    const TestRequest* request,
                    TestResponse* response,
                    google::protobuf::Closure* done):
        mController(controller),
        mRequest(request),
        mResponse(response),
        mDone(done)
    {
    }

    virtual void run()
    {
        qDebug() << "work started";

        // simulate some long job
        for (int i = 0; i < 30; ++i)
        {
            msleep(1000);
            if (mController->IsCanceled())
            {
                break;
            }
        }

        if (mController->IsCanceled())
        {
            qDebug() << "work cancelled";
        }
        else
        {
            qDebug() << "work finished";
            mResponse->set_response(mRequest->request());
        }

        mDone->Run();
        deleteLater();
    }

private:
    google::protobuf::RpcController* mController;
    const TestRequest* mRequest;
    TestResponse* mResponse;
    google::protobuf::Closure* mDone;
};


void TestServiceImpl::echo(::google::protobuf::RpcController* /*controller*/,
                                  const TestRequest* request,
                                  TestResponse* response,
                                  ::google::protobuf::Closure* done)
{
    response->set_response(request->request());

    done->Run();
}

void TestServiceImpl::cancellableEcho(google::protobuf::RpcController* controller,
                                      const TestRequest* request,
                                      TestResponse* response,
                                      google::protobuf::Closure* done)
{
    (new DelayedResponse(controller, request, response, done))->start();
}

}
}
